iT邦幫忙

2024 iThome 鐵人賽

DAY 15
1
DevOps

今天不學遺傳學,跟著Kubernetes種豌豆系列 第 15

Day15. 讓責任 更加輕鬆之CSR 管理與限定範圍

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20240819/20168178UyFMt9a9sF.png

在上一篇提到,建立K8s叢集內管理員及元件的憑證,在後續若有新的使用者加入,需處理的流程:

  1. 產生 private key
  2. 產生 CertificateSigningRequest (CSR)給Admin
  3. Admin將CSR給 CA server作簽署後再回傳憑證
  4. 新使用者便可用此憑證存取叢集
  5. 憑證具有期限,因此要定期更新,重複步驟上述

由於CA server及其擁有的憑證,具有建立任何權限角色的能力,只會放在特定安全的server(the one and only),每次要簽署憑證都需登入該server,使用規模擴大時,這些過程變得繁瑣

K8s提供憑證API,流程改變如下:

  1. 新使用者將CSR以API的方式傳送給admin
  2. admin建立K8s API object CertificateSigningRequest
  3. CertificateSigningRequest 傳送至CA server (如:control plane)
  4. 當此object建立後,所有叢集內的admin皆可見: 透過kubectl指令操作
    • 查看: kubectl get csr
    • 批准: kubectl certificate approve <xxx>
    • 拒絕: kubectl certificate deny <xxx>
  5. K8s使用 CA key簽署,產生的憑證即可交給使用者
    • 由control manager內的CSR-Approving,CSR-Signing等處理這些作業

舉例:Doe為叢集新使用者

  • 有自己的private key: openssl genrsa -out doe.key 2048
  • 產生csr: openssl req -new -key doe.key -subj "/CN=doe" -out doe.csr
  • 產生CSR object: 內容須以base64編碼,放在request欄位
    • 編碼cat doe.csr | base64
    • CSR object:
      apiVersion: certificates.k8s.io/v1beta1
      kind: CertificateSigningRequest
      metadata:
        name: doe
      spec:
        groups:
        - system:authenticated
        usages:
        - digital signature
        - key encipherment
        - server auth
      # 編碼後的內容放在request
      request:
      <base64編碼後的CSR>
      

建立憑證後,使用者可存取叢集,下一個關卡:限定使用者可存取的環境

Security KUBECONFIG

kubectl所用的憑證,統一置於kubeconfig file,預設會去查 $HOME/.kube/config,包含有3部份:

  1. 叢集 Cluster: Development, Production ... 多個環境
  2. 上下文 Context: 將使用者與環境相關聯
  3. 角色類型 Users: Admin, Dev User, Prod User...
apiVersion: v1
kind: Config
# 初始的上下文 使用者 @ cluster
current-context: admin@my-kube-playground

clusters:
- name: my-kube-playground
    certificate-authority: etc/kubernetes/pki/ca.crt
    certificate-authority-data: 或用此欄位,放入 base64編碼的ca file
    server: https://172.17.0.5:6443
- name: development
    certificate-authority-data: 
    server: 

contexts:
- name: admin@my-kube-playground
    context:
     cluster: my-kube-playground
     user: admin
     # 綁定namespace
     namespace: test-namespace

users:
- name: admin
    client-certificate: etc/kubernetes/pki/users/admin.crt
    client-key: etc/kubernetes/pki/users/admin.key

config指令

# 查看預設config
kubectl config view
# 查看特定config
kubectl config view –kubeconfig=my-custom-config
# 使用特定的context
kubectl config use-context admin@my-kube-playground
#查看說明
kubectl config -h

附錄: 查看憑證內容

平時從瀏覽器可以直接點選查看憑證內容
https://ithelp.ithome.com.tw/upload/images/20240819/20168178hONDDzTOm0.png

  • 以kubeadm建立cluster:可從配置文件查找
    • 從config檔取得文件: 控制平台元件,以static pod形式部署 ps -aux | grep kubelet
    • https://ithelp.ithome.com.tw/upload/images/20240819/201681788QfLSMEGg0.png
    • 憑證位置: 查看static pod配置: cat /var/lib/kubelet/config.yaml
    • https://ithelp.ithome.com.tw/upload/images/20240819/20168178S0OFaHCJlz.png
    • 查看檔案內容: cat /etc/kubernetes/manifests/kube-apiserver.yaml
    • https://ithelp.ithome.com.tw/upload/images/20240819/20168178o3kLlmc06R.png
    • 解讀內容: openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text -noout
    • https://ithelp.ithome.com.tw/upload/images/20240819/20168178JMEl7uXfJg.png

上一篇
Day14. 通訊安全,層層把關
下一篇
Day16. 什麼身分,做什麼事,沒說的就是不行!
系列文
今天不學遺傳學,跟著Kubernetes種豌豆30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言